Garbage Collection

Abstract

在堆中分配且通过任何程序变量形成的指针链都无法到达的记录被称为垃圾 garbage。垃圾占据的存储空间应当被回收,以便分配给新的记录,这一过程叫做垃圾收集 Garbage Collection。

标记 - 清扫式收集

算法流程

  1. 所有的程序变量都构成了图中的根
  2. (标记阶段)通过 深度优先搜索算法 从根开始标记变量
    • 如果变量 x 为指针,则标记 x 指向的内存,并遍历内存的存储内容
    • 如果变量 x 不是指针,结束遍历
  3. (清扫阶段)从堆中的第一个地址出发
    • 如果该地址已被标记,则去除标记
    • 如果该地址未被标记,则将其加入空闲表

「引用计数」优化

复制式收集

收集初始化

转递 forwarding

Cheney 算法

scan <-  next <- to-space 的开始
for 每一个根 r
	r <- Forward(r)
while scan < next
	for scan 处的那个记录的每一个域 fi
		scan.fi <- Forward(scan.fi)
	scan <- scan + scan 处的那个记录的大小	

Pasted image 20230525112145.png